package com.cs.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cs.dao.ProdEsDto;
import com.cs.domain.Prod;
import com.cs.es.ProdEs;
import com.cs.service.ImportService;
import com.cs.service.ProdService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
@Slf4j
public class ImportServiceImpl implements ImportService, CommandLineRunner {
    @Autowired
    private ProdService prodService;

    @Autowired
    private ProdEsDto prodEsDao;

    /**
     * 起始时间
     */
    private Date t1;

    /**
     * 每页的条数
     */
    @Value("${esimport.size}")
    private Integer size;
    /**
     * 全量导入
     * 项目已启动 分页分批多线程一起实现
     */
    @Override
    public void importAll() {
        //查询分页的总条数
        Integer countTotal=prodService.getTotal(null,null);
        if(countTotal==null || countTotal==0){
            log.info("全量导入 商品的数量为0");
            return;
        }
        //计算分页
        int page = countTotal%size==0?countTotal/size:(countTotal/size)+1;
        for (int i = 0; i <= page; i++) {
            // 查询mysql 导入的方法
            importProdToEs(i, size, null, null);
        }
        log.info("导入成功");
        // 记录一下t1
        t1 = new Date();
    }

    /**
     * 查询导入es的方法
     * @param i 页码
     * @param size 每页的数量
     * @param t1
     * @param t2
     */
    private void importProdToEs(int i, Integer size, Object t1, Object t2) {
        //这里分页查询不需要总条数 之前已经查过了
        Page<Prod> prodPage = new Page<>(i,size,false);
        // 2.查询prod表
        List<Prod> prodList = prodService.findProdPageByTime(prodPage, t1, t2);
        //组装对象
        ArrayList<ProdEs> prodEsList = new ArrayList<>();
        prodList.forEach(prod -> {
            ProdEs prodEs = new ProdEs();
            BeanUtils.copyProperties(prod,prodEs);
            prodEsList.add(prodEs);
        });
        // 4.导入es
        prodEsDao.saveAll(prodEsList);
    }

    /**
     * 增量导入
     * 定期导入
     */
    @Override
    @Scheduled(initialDelay = 120*1000,fixedRate = 120*1000)
    public void importUpdate() {
        log.info("增量导入开始");
        // 每次执行增量导入 时间就往后推移
        Date t2 = new Date();
        Integer totalCount = prodService.getTotal(t1, t2);
        if (totalCount == null || totalCount == 0) {
            // 把时间窗口往后推移  11.29    2033 - 11.29
            t1 = t2;
            log.info("增量导入 商品数量为0");
            return;
        }
        // 2.计算分页
        int page = totalCount % size == 0 ? totalCount / size : ((totalCount / size) + 1);
        // 3.循环使用mybatis循环mysql
        for (int i = 1; i <= page; i++) {
            // 查询mysql 导入的方法
            importProdToEs(i, size, t1, t2);
        }
        log.info("导入完成");
        // 把时间窗口往后推移
        t1 = t2;


    }

    /**
     * 快速导入
     */
    @Override

    public void importQuick() {

    }

    /**
     * 项目已启动就运行的方法
     * @param args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        importAll();
    }
}
